Table of contents

  1. The Affordable Care Act

  2. Difference-in-Differences

  3. ACA Data

  4. Medicaid Expansion and Prevalence of Health Insurance

class: inverse, center, middle name: aca

Background on the Affordable Care Act


Background

  1. What percent of people are uninsured?
.plot-callout[ ]
# What percent of people are uninsured?

Background

  1. What percent of people are uninsured?

  2. How do people get health insurance?

.plot-callout[ ]
# How do people get health insurance?

Employer provided insurance

The U.S. still relies heavily on private insurance provided by employers.



Any thoughts on why?
# Employer provided insurance
1. Stabalization act of 1942 (wages frozen but not benefits)
2. Tax exclusion for insurance expenditures (1954)

How did the ACA change things?

  1. Create health insurance exhanges
    • Individual mandate (since set to $0)
    • Premium and cost-sharing subsidies (some unpaid by Trump administration)
    • Insurance subsidies (removed before intended)
    • Decision assistance
    • Minimum benefits and community ratings

  2. Stay on parent’s plan to 26

Change in Insurance Type over Time

What does the literature say

The Kaiser Family Foundation has some great info on this…
- KFF Medicaid Coverage - KFF Report on ACA Expansion - Health Insurance and Mortality (not what we’re discussing here but still important)

class: inverse, center, middle name: dd

Difference-in-Differences


Setup

[:col_header , Post-period, Pre-period] [:col_row Treated, \(E(Y_{1}(1)|W=1)\), \(E(Y_{0}(0)|W=1)\)] [:col_row Control, \(E(Y_{0}(1)|W=0)\), \(E(Y_{0}(0)|W=0)\)]


Strategy 1: Estimate \(E[Y_{0}(1)|W=1]\) using \(E[Y_{0}(0)|W=1]\) (before treatment outcome used to estimate post-treatment)

Setup

[:col_header , Post-period, Pre-period] [:col_row Treated, \(E(Y_{1}(1)|W=1)\), \(E(Y_{0}(0)|W=1)\)] [:col_row Control, \(E(Y_{0}(1)|W=0)\), \(E(Y_{0}(0)|W=0)\)]


Strategy 3: DD estimate…


Estimate \(E[Y_{1}(1)|W=1] - E[Y_{0}(1)|W=1]\) using \(E[Y_{0}(1)|W=0] - E[Y_{0}(0)|W=0]\) (pre-post difference in control group used to predict difference for treatment group)

Estimation

Key identifying assumption is that of parallel trends



\[E[Y_{0}(1) - Y_{0}(0)|W=1] = E[Y_{0}(1) - Y_{0}(0)|W=0]\]
# Estimation Sample means:
\[\begin{align} E[Y_{1}(1) - Y_{0}(1)|W=1] &=& \left( E[Y(1)|W=1] - E[Y(1)|W=0] \right) \\ & & - \left( E[Y(0)|W=1] - E[Y(0)|W=0]\right) \end{align}\]

Estimation

Regression:
\(Y_{i} = \alpha + \beta W_{i} + \lambda 1(Post) + \delta W_{i} \times 1(Post) + \varepsilon\)


[:col_header , After, Before, After - Before] [:col_row Treated, \(\alpha + \beta + \lambda + \delta\), \(\alpha + \beta\), \(\lambda + \delta\)] [:col_row Control, \(\alpha + \lambda\), \(\alpha\), \(\lambda\)] [:col_row Treated - Control, \(\beta + \delta\), \(\beta\), \(\delta\)]

Mean differences

dd.means <- dd.dat %>% group_by(w, t) %>% summarize(mean_y = mean(y.out))
knitr::kable(dd.means, col.names=c("Treated","Post","Mean"), format="html")
Treated Post Mean
FALSE FALSE 1.522635
FALSE TRUE 3.002374
TRUE FALSE 4.515027
TRUE TRUE 12.004623

Regression estimator

dd.est <- lm(y.out ~ w + t + w*t, data=dd.dat)
summary(dd.est)
## 
## Call:
## lm(formula = y.out ~ w + t + w * t, data = dd.dat)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.0038 -0.6674  0.0047  0.6609  3.6135 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.52263    0.01970   77.28   <2e-16 ***
## wTRUE        2.99239    0.02795  107.07   <2e-16 ***
## tTRUE        1.47974    0.02786   53.10   <2e-16 ***
## wTRUE:tTRUE  6.00986    0.03953  152.05   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9881 on 9996 degrees of freedom
## Multiple R-squared:  0.9433, Adjusted R-squared:  0.9433 
## F-statistic: 5.543e+04 on 3 and 9996 DF,  p-value: < 2.2e-16

class: inverse, center, middle name: aca_data

Insurance Data and Medicaid Expansion


Data sources

Code and links available at the Insurance Access GitHub repository

Insurance status and source

Summary stats

And now for some basic summary stats (pooling all years):

stargazer(as.data.frame(ins.dat %>% select(perc_unis, perc_direct, perc_medicaid)), type="html")
## Error: Can't subset columns that don't exist.
## x The column `perc_unis` doesn't exist.

Uninsurance over time

Direct purchase over time

Medicaid enrollment over time

class: inverse, center, middle name: medicaid

Medicaid expansion and health insurance?


Research design

Use pre/post and expansion/non-expansion states to identify effect of Medicaid expansion: \[y_{it} = \alpha + \beta \times 1(Post) + \gamma \times 1(Expand) + \delta \times 1(Post) \times 1(Expand) + \varepsilon\]

Event study

This is poorly named: - In finance, even study is just an interrupted time series - In economics, we usually have a treatment/control group and a break in time

Event study

Second, run regression with full set of interactions and group/year dummies:

event.ins.reg <- lm(perc_unins ~ expand_2012 + expand_2014 + 
                      expand_2015 + expand_2016 + expand_2017 + 
                      expand_2018 + factor(year) + factor(State), data=event.dat)
point.est <- as_tibble(c(event.ins.reg$coefficients[c("expand_2012","expand_2014","expand_2015",
                                            "expand_2016","expand_2017","expand_2018")]),
                       rownames = "term")
ci.est <- as_tibble(confint(event.ins.reg)[c("expand_2012","expand_2014","expand_2015",
                                   "expand_2016","expand_2017","expand_2018"),],
                    rownames = "term")

Event study

Finally, plot coefficients and confidence intervals

.plot-callout[ ]

Fixed Effects?

Recall our original regression specification:
\(y_{it} = \alpha + \beta \times 1(Post) + \gamma \times 1(Expand) + \delta \times 1(Post) \times 1(Expand) + \varepsilon\)


This is a special case of a general fixed effects estimator:
\(y_{it} = \alpha + \delta W_{it} + \gamma_{i} + \gamma_{t} + \varepsilon\),
where \(\gamma_{i}\) and \(\gamma_{t}\) denote a set of coefficients on state (\(i\)) and year (\(t\)) dummy variables (or fixed effects).

Equivalence

DD is just a special case of the fixed effects approach.

.pull-left[

summary(lm(perc_unins ~ post + expand_ever + post*expand_ever, data=ins.dat.2014))
## 
## Call:
## lm(formula = perc_unins ~ post + expand_ever + post * expand_ever, 
##     data = ins.dat.2014)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.115667 -0.027106 -0.006804  0.027765  0.117597 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               0.213965   0.007180  29.799  < 2e-16 ***
## postTRUE                 -0.054068   0.008496  -6.364 7.22e-10 ***
## expand_everTRUE          -0.046326   0.009166  -5.054 7.48e-07 ***
## postTRUE:expand_everTRUE -0.018403   0.010845  -1.697   0.0908 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.04187 on 304 degrees of freedom
##   (7 observations deleted due to missingness)
## Multiple R-squared:  0.4995, Adjusted R-squared:  0.4946 
## F-statistic: 101.1 on 3 and 304 DF,  p-value: < 2.2e-16

]

.pull-right[

summary(felm(perc_unins ~ treat | factor(State) + factor(year), data=ins.dat.2014))
## 
## Call:
##    felm(formula = perc_unins ~ treat | factor(State) + factor(year),      data = ins.dat.2014) 
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.042349 -0.007307 -0.000520  0.007342  0.039814 
## 
## Coefficients:
##        Estimate Std. Error t value Pr(>|t|)    
## treat -0.018403   0.003702  -4.971 1.22e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01429 on 257 degrees of freedom
##   (7 observations deleted due to missingness)
## Multiple R-squared(full model): 0.9507   Adjusted R-squared: 0.9411 
## Multiple R-squared(proj model): 0.0877   Adjusted R-squared: -0.08979 
## F-statistic(full model):99.11 on 50 and 257 DF, p-value: < 2.2e-16 
## F-statistic(proj model): 24.71 on 1 and 257 DF, p-value: 1.22e-06

]